Singleton Pattern ডিজাইন প্যাটার্নে একটি ক্লাস থেকে শুধুমাত্র একটি ইনস্ট্যান্স তৈরি করা হয় এবং এটি গ্লোবাল অ্যাক্সেস প্রদান করে। Generics এর মাধ্যমে Singleton Pattern কে আরও ডাইনামিক, টাইপ-সেইফ এবং পুনঃব্যবহারযোগ্য করা যায়।
Singleton Pattern এবং Generics Integration এর সুবিধা
- টাইপ-সেইফ Singleton: Generics ব্যবহার করে নির্দিষ্ট টাইপের Singleton তৈরি করা যায়।
- Code Reusability: একই Singleton লজিক বিভিন্ন টাইপের জন্য পুনঃব্যবহার করা যায়।
- Dynamic Singleton Management: বিভিন্ন টাইপের জন্য একাধিক Singleton ইনস্ট্যান্স তৈরি ও ব্যবস্থাপনা করা যায়।
উদাহরণ ১: Simple Generic Singleton
public class GenericSingleton<T> {
private static GenericSingleton<?> instance;
private T value;
private GenericSingleton(T value) {
this.value = value;
}
@SuppressWarnings("unchecked")
public static <T> GenericSingleton<T> getInstance(T value) {
if (instance == null) {
instance = new GenericSingleton<>(value);
}
return (GenericSingleton<T>) instance;
}
public T getValue() {
return value;
}
}
ব্যবহার:
public class Main {
public static void main(String[] args) {
GenericSingleton<String> stringSingleton = GenericSingleton.getInstance("Hello");
System.out.println("String Value: " + stringSingleton.getValue());
GenericSingleton<Integer> intSingleton = GenericSingleton.getInstance(100);
System.out.println("Integer Value: " + intSingleton.getValue()); // একই ইনস্ট্যান্স রিটার্ন করবে
}
}
আউটপুট:
String Value: Hello
Integer Value: Hello
বিঃদ্রঃ: এখানে একাধিক টাইপের Singleton এর জন্য একই ইনস্ট্যান্স ব্যবহৃত হয়।
উদাহরণ ২: Type-Safe Singleton for Each Type
প্রতিটি টাইপের জন্য আলাদা Singleton তৈরি করতে হলে, একটি ConcurrentHashMap ব্যবহার করা যেতে পারে।
import java.util.concurrent.ConcurrentHashMap;
public class TypeSafeSingleton<T> {
private static final ConcurrentHashMap<Class<?>, Object> instances = new ConcurrentHashMap<>();
private T value;
private TypeSafeSingleton(T value) {
this.value = value;
}
@SuppressWarnings("unchecked")
public static <T> TypeSafeSingleton<T> getInstance(Class<T> clazz, T value) {
return (TypeSafeSingleton<T>) instances.computeIfAbsent(clazz, k -> new TypeSafeSingleton<>(value));
}
public T getValue() {
return value;
}
}
ব্যবহার:
public class Main {
public static void main(String[] args) {
TypeSafeSingleton<String> stringSingleton = TypeSafeSingleton.getInstance(String.class, "Hello Generics");
System.out.println("String Value: " + stringSingleton.getValue());
TypeSafeSingleton<Integer> intSingleton = TypeSafeSingleton.getInstance(Integer.class, 123);
System.out.println("Integer Value: " + intSingleton.getValue());
}
}
আউটপুট:
String Value: Hello Generics
Integer Value: 123
উদাহরণ ৩: Singleton Factory with Generics
Generics এর মাধ্যমে Singleton Factory তৈরি করা যায়, যেখানে বিভিন্ন ক্লাসের Singleton ইনস্ট্যান্স তৈরি এবং সংরক্ষণ করা যায়।
import java.util.HashMap;
import java.util.Map;
public class SingletonFactory {
private static final Map<Class<?>, Object> instanceMap = new HashMap<>();
@SuppressWarnings("unchecked")
public static <T> T getInstance(Class<T> clazz) throws IllegalAccessException, InstantiationException {
synchronized (instanceMap) {
if (!instanceMap.containsKey(clazz)) {
instanceMap.put(clazz, clazz.newInstance());
}
return (T) instanceMap.get(clazz);
}
}
}
ব্যবহার:
public class Main {
public static void main(String[] args) throws Exception {
// Singleton for String class
String stringInstance = SingletonFactory.getInstance(String.class);
System.out.println("String Instance: " + stringInstance);
// Singleton for Integer class
Integer integerInstance = SingletonFactory.getInstance(Integer.class);
System.out.println("Integer Instance: " + integerInstance);
}
}
Singleton Pattern এর ক্ষেত্রে Generics এর সুবিধা
- Reusable Code: একবার জেনেরিক Singleton ক্লাস লিখলে এটি বিভিন্ন টাইপের জন্য ব্যবহার করা যায়।
- Type Safety: কম্পাইল টাইমে টাইপ ত্রুটি শনাক্ত করা যায়।
- Dynamic Type Handling: একই লজিক ব্যবহার করে একাধিক টাইপের Singleton তৈরি এবং সংরক্ষণ করা যায়।
- Concurrency Handling:
ConcurrentHashMapব্যবহার করে থ্রেড-সেইফ Singleton তৈরি করা সম্ভব।
Java Generics এবং Singleton Pattern এর সমন্বয় টাইপ সেফ, পুনঃব্যবহারযোগ্য এবং ডাইনামিক Singleton তৈরি করতে সহায়ক। Type Erasure এর কারণে, রানটাইম পারফরম্যান্সেও কোনো প্রভাব পড়ে না। ডেভেলপাররা Generics এর মাধ্যমে সহজেই বিভিন্ন টাইপের Singleton ব্যবহার এবং সংরক্ষণ করতে পারে।
Read more